import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:love_newf/app/com/base/L.dart';
import 'package:love_newf/app/com/util/GZIPUtils.dart';
import 'package:love_newf/app/com/model/room_data_model.dart';
import 'package:love_newf/app/page/live/live_logic.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimGroupListener.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_info.dart';

RoomMessageListener roomMessageListener = RoomMessageListener();

///其实就是群消息通知，主要是房间内的信息。
class RoomMessageListener {
  void call(RoomDataModel data) {
    ///消息类型 1 赠送礼物，2 申请上麦，3 通知用户推流，4 麦位信息变更，
    ///5 加冕天使，6 3人间-专属房相互转换，7 进场特效，
    ///8专属房开始计时，9 申请上麦，在线人数变化，10 开始/结束PK，11 K歌最新数据通知
    switch (data.msgType) {
      case MsgType.ACTION_MSG:
        if (data.givePropMsg?.sendUserVO != null) {
          LiveLogic.logic?.receiveGiftMessage(data);
        }
        if (data.roomMais.isNotEmpty && LiveLogic.logic != null) {
          LiveLogic.logic?.roomData?.roomMais = data.roomMais;
          LiveLogic.logic?.roomData?.givePropMsg = data.givePropMsg;
          LiveLogic.logic?.refreshMains;
        }

        break;
      case MsgType.ACTION_APPLY:
        LiveLogic.logic?.receivedShangMaiApply(data.inputSteamMsg!);
        break;
      case 3: //通知用户推流。 上麦：目前场景，直播间内，直播间外。
      case 4: //4 麦位信息变更，
        updateMais(data);
        break;
      case MsgType.ACTION_BROADCAST_GUARD_LOVER:
        break;
      case MsgType.ACTION_JOIN_TRAIN:
      case 7:
        LiveLogic.logic?.playGift(data.givePropMsg!);
        break;
      case 9: //申请上麦，在线人数变化，三人间有 申请人数，在线人数 显示。
        break;
    }
  }

  updateMais(RoomDataModel data) {

    LiveLogic? logic = LiveLogic.logic;
    if (logic?.roomData?.roomMais == null) return;
    RoomDataInputSteamMsg? inputSteamMsg = data.inputSteamMsg;
    if (logic != null && inputSteamMsg != null) {
      //直播间内
      for (var item in logic.roomData!.roomMais) {
        if (item.maiIndex == inputSteamMsg.maiIndex) {
          if (data.msgType == 4 && (inputSteamMsg.inputStreamId).isEmpty) {
            //后端没有返回，手动做下兼容
            inputSteamMsg.inputStreamId = item.inputStreamId;
          }
          item.inputStreamId = inputSteamMsg.inputStreamId;

          ///后端没有返回 outputStreamId 字段。
          item.outputStreamId = inputSteamMsg.inputStreamId;
          item.status = inputSteamMsg.maiStatus;
          item.userId = inputSteamMsg.userId;
          item.maiOpen = inputSteamMsg.maiOpen;
          break;
        }
      }
      logic.refreshMains;
    } else {
      //直播间外
    }
  }
}

class MsgType {
  static const int ACTION_MSG = 1;
  static const int ACTION_INVITE = 2; // 邀请进入直播间
  static const int ACTION_APPLY = 2; // 申请上麦
  static const int ACTION_AGREE_EXCLUSIVE = 3; // 同意加入专属房间
  static const int ACTION_VIDEO_CALL = 4;
  static const int ACTION_BROADCAST_GUARD_LOVER = 5;
  static const int ACTION_JOIN_TRAIN = 6; //同意加入 培训房

  static const int ACTION_GIFT = 9; //申请上麦，在线人数变化，
  static const int ACTION_PK = 10;
  static const int ACTION_SONG = 11;
  static const int ACTION_TOPPING = 12;
  static const int ACTION_TRAIN = 13;
}

///需要测试下，是否需要每次新的。还是复用同一个
V2TimGroupListener v2timGroupListener = V2TimGroupListener(
  onApplicationProcessed: (String groupID, V2TimGroupMemberInfo opUser,
      bool isAgreeJoin, String opReason) async {
//加群请求已经被群主或管理员处理了（只有申请人能够收到）
//groupID    群 ID
//opUser    处理人
//isAgreeJoin    是否同意加群
//opReason    处理原因
  },
  onGrantAdministrator: (String groupID, V2TimGroupMemberInfo opUser,
      List<V2TimGroupMemberInfo> memberList) async {
//指定管理员身份
//groupID    群 ID
//opUser    处理人
//memberList    被处理的群成员
  },
  onGroupAttributeChanged:
      (String groupID, Map<String, String> groupAttributeMap) async {
//收到群属性更新的回调
//groupID    群 ID
//groupAttributeMap    群的所有属性
  },
  onGroupCreated: (String groupID) async {
//创建群（主要用于多端同步）
//groupID    群 ID
  },
  onGroupDismissed: (String groupID, V2TimGroupMemberInfo opUser) async {
//群被解散了（全员能收到）
//groupID    群 ID
//opUser    处理人
    LiveLogic.logic?.exitRoom();
  },
  onGroupInfoChanged:
      (String groupID, List<V2TimGroupChangeInfo> changeInfos) async {
//群信息被修改（全员能收到）
//groupID    群 ID
//changeInfos    修改的群信息
  },
  onGroupRecycled: (String groupID, V2TimGroupMemberInfo opUser) async {
//群被回收（全员能收到）
//groupID    群 ID
//opUser    处理人
  },
  onMemberEnter: (String groupID, List<V2TimGroupMemberInfo> memberList) async {
//有用户加入群（全员能够收到）
//groupID    群 ID
//memberList    加入的成员
  },
  onMemberInfoChanged: (String groupID,
      List<V2TimGroupMemberChangeInfo> v2TIMGroupMemberChangeInfoList) async {
//群成员信息被修改，仅支持禁言通知（全员能收到）。
//groupID    群 ID
//v2TIMGroupMemberChangeInfoList    被修改的群成员信息
  },
  onMemberInvited: (String groupID, V2TimGroupMemberInfo opUser,
      List<V2TimGroupMemberInfo> memberList) async {
//某些人被拉入某群（全员能够收到）
//groupID    群 ID
//opUser    处理人
//memberList    被拉进群成员
  },
  onMemberKicked: (String groupID, V2TimGroupMemberInfo opUser,
      List<V2TimGroupMemberInfo> memberList) async {
//某些人被踢出某群（全员能够收到）
//groupID    群 ID
//opUser    处理人
//memberList    被踢成员
    for (var item in memberList) {
      if (L.userInfo.userId.toString() == item.userID) {
//被踢
        LiveLogic.logic?.kicked();
      }
    }
  },
  onMemberLeave: (String groupID, V2TimGroupMemberInfo member) async {
//有用户离开群（全员能够收到）
//groupID    群 ID
//member    离开的成员
  },
  onQuitFromGroup: (String groupID) async {
//主动退出群组（主要用于多端同步，直播群（AVChatRoom）不支持）
//groupID    群 ID
  },
  onReceiveJoinApplication:
      (String groupID, V2TimGroupMemberInfo member, String opReason) async {
//有新的加群请求（只有群主或管理员会收到）
//groupID    群 ID
//member    申请人
//opReason    申请原因
  },
  onReceiveRESTCustomData: (String groupID, String content1) {
    ///不是当前房间，不接收。
    if (LiveLogic.logic?.roomInfo.id.toString() != groupID) return;
    var content = GZIPUtils.decompress(content1);
    if (content.isEmpty) return;
    if (kDebugMode) {
      String timeStamp = DateTime.now().toString();
      print('[$timeStamp]onRecvNewMessage room :$content');
    }
    roomMessageListener.call(RoomDataModel.fromJson(json.decode(content)));
  },
  onRevokeAdministrator: (String groupID, V2TimGroupMemberInfo opUser,
      List<V2TimGroupMemberInfo> memberList) async {
//取消管理员身份
//groupID    群 ID
//opUser    处理人
//memberList    被处理的群成员
  },
);
